package br.fatec.ads.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import br.fatec.ads.connection.DataSource;
import br.fatec.ads.exception.DataBaseException;
import br.fatec.ads.exception.TipoAgendamentoException;
import br.fatec.ads.model.TipoAgendamento;

public class TipoAgendamentoDAO {
	private static TipoAgendamentoDAO tipoAgendamentoDAO;
	private static String INCLUIR_TIPO_AGENDAMENTO = "EXEC P_TIPO_AGENDAMENTO_INCLUIR ?, ?";
	private static String EXCLUIR_TIPO_AGENDAMENTO = "EXEC P_TIPO_AGENDAMENTO_EXCLUIR ?, ?";
	private static String CONSULTAR_TIPO_AGENDAMENTO = "EXEC P_TIPO_AGENDAMENTO_CONSULTAR ?";
	private static String LISTAR_TIPO_AGENDAMENTO = "EXEC P_TIPO_AGENDAMENTO_LISTAR ?";
	
	public TipoAgendamentoDAO() {
		super();
	}
	
	public static TipoAgendamentoDAO getInstance(){
		if(tipoAgendamentoDAO == null){
			tipoAgendamentoDAO = new TipoAgendamentoDAO();
		}
		
		return tipoAgendamentoDAO;
	}
	
	public void incluirTipoAgendamento(TipoAgendamento tipoAgendamento) throws TipoAgendamentoException, DataBaseException{
        Connection connection = null;
        PreparedStatement query = null;

        try{
            try{
                connection = DataSource.getConnection();
                query = connection.prepareStatement(INCLUIR_TIPO_AGENDAMENTO);

                int i = 0;
                query.setString(++i, tipoAgendamento.getDescTipoAgendamento());
                query.setString(++i, tipoAgendamento.getUsuario());
                
                query.executeUpdate();
            }catch(SQLException cause){
                throw new TipoAgendamentoException("Problemas ao INSERIR o Tipo Agendamento!", cause);
            }finally{
                DataSource.close(connection);
                DataSource.close(query);
            }
        } catch(DataBaseException cause){
            throw new DataBaseException(cause);
        }
    }
	
	public void excluirTipoAgendamento(TipoAgendamento tipoAgendamento) throws TipoAgendamentoException, DataBaseException{
        Connection connection = null;
        PreparedStatement query = null;

        try{
            try{
                connection = DataSource.getConnection();
                query = connection.prepareStatement(EXCLUIR_TIPO_AGENDAMENTO);

                int i = 0;
                query.setInt(++i, tipoAgendamento.getIdTipoAgendamento());
                query.setString(++i, tipoAgendamento.getUsuario());

                query.executeUpdate();
            }catch(SQLException cause){
                throw new TipoAgendamentoException("Problemas ao EXCLUIR o Tipo Agendamento!", cause);
            }finally{
                DataSource.close(connection);
                DataSource.close(query);
            }
        }catch(DataBaseException cause){
            throw new DataBaseException(cause);
        }
    }
	
	public TipoAgendamento getTipoAgendamento(int idTipoAgendamento) throws TipoAgendamentoException, DataBaseException{
    	Connection connection = null;
    	PreparedStatement query = null;
    	ResultSet resultSet = null;
    	TipoAgendamento tipoAgendamento = null;
    	
    	try{
    		try{
    			tipoAgendamento = new TipoAgendamento();
    			
    			connection = DataSource.getConnection();
    			query = connection.prepareStatement(CONSULTAR_TIPO_AGENDAMENTO);
    			
    			int i = 0;
    			query.setInt(++i, idTipoAgendamento);
    			
    			resultSet = query.executeQuery();
    			
    			while(resultSet.next()){
    				tipoAgendamento.setIdTipoAgendamento(resultSet.getInt("IDTIPOAGENDAMENTO"));
    				tipoAgendamento.setDescTipoAgendamento(resultSet.getString("DESCTIPOAGENDAMENTO"));
    				tipoAgendamento.setAtivo(resultSet.getString("IDTIPOAGENDAMENTO"));
    				tipoAgendamento.setDataHora(resultSet.getTimestamp("DTHRINCLUSAO"));
    				tipoAgendamento.setUsuario(resultSet.getString("USUARIOINCLUSAO"));
    			}
    		}catch (SQLException cause) {
    			throw new TipoAgendamentoException("Problemas ao CONSULTAR o Tipo Agendamento!", cause);
			}finally{
				DataSource.close(connection);
				DataSource.close(query);
				DataSource.close(resultSet);
			}
    	}catch (DataBaseException cause) {
    		throw new DataBaseException(cause);
		}
    	
    	return tipoAgendamento;
    }
	
	public List listarTipoAgendamento(TipoAgendamento tipoAgendamento) throws TipoAgendamentoException, DataBaseException{
    	Connection connection = null;
    	PreparedStatement query = null;
    	ResultSet resultSet = null;
    	List listaTipoAgendamento = new ArrayList();
    	
    	try{
    		try{
    			connection = DataSource.getConnection();
    			query = connection.prepareStatement(LISTAR_TIPO_AGENDAMENTO);
    			
    			int i = 0;
    			query.setInt(++i, tipoAgendamento.getIdTipoAgendamento());
    			
    			resultSet = query.executeQuery();
    			
    			while(resultSet.next()){
    				TipoAgendamento tipoAgend = new TipoAgendamento();
    				
    				tipoAgend.setIdTipoAgendamento(resultSet.getInt("IDTIPOAGENDAMENTO"));
    				tipoAgend.setDescTipoAgendamento(resultSet.getString("DESCTIPOAGENDAMENTO"));
    				tipoAgend.setAtivo(resultSet.getString("IDTIPOAGENDAMENTO"));
    				tipoAgend.setDataHora(resultSet.getTimestamp("DTHRINCLUSAO"));
    				tipoAgend.setUsuario(resultSet.getString("USUARIOINCLUSAO"));
    				
    				listaTipoAgendamento.add(tipoAgend);
    			}
    		}catch (SQLException cause) {
    			throw new TipoAgendamentoException("Problemas ao LISTAR o Tipo Agendamento!", cause);
			}finally{
				DataSource.close(connection);
				DataSource.close(query);
				DataSource.close(resultSet);
			}
    	}catch (DataBaseException cause) {
    		throw new DataBaseException(cause);
		}
    	
    	return listaTipoAgendamento;
    }
}